#!/bin/bash
set -e

# =======================================================
# Supervisor & Entrypoint Script (V2.1 - Final Robust)
# 负责更新游戏、启动cron和Unturned服务、并实现真正的优雅关停
# =======================================================

TMUX_SESSION="unturned"
# 定义一个唯一的频道名称，用于 tmux 内外通信
TMUX_WAIT_CHANNEL="unturned-server-shutdown-signal"

# 1. 定义优雅关闭函数
# 当脚本接收到 Docker 发来的停止信号时，会执行此函数
shutdown() {
  echo ">>> Gracefully shutting down Unturned server (SIGTERM received)..."
  
  # 检查 tmux 会话是否存在，防止脚本出错时重复执行
  if tmux has-session -t "$TMUX_SESSION" 2>/dev/null; then
    echo ">>> Sending 'shutdown' command to the game server."
    # 向游戏服务器发送 'shutdown' 命令，让它自己保存并退出
    tmux send-keys -t "$TMUX_SESSION" "shutdown" C-m
    echo ">>> Shutdown command sent. Script will now wait for the game process to fully exit."
  else
    echo ">>> tmux session not found. Assuming process is already dead. Exiting."
  fi
  
  # 这个函数只负责发送关机命令，真正的“等待”逻辑在脚本的主体部分。
}

# 2. 设置信号陷阱 (Trap)
# 捕获 Docker Stop 发送的 SIGTERM 信号 和 Ctrl+C 发送的 SIGINT 信号
# 一旦捕获到信号，就调用上面定义的 shutdown 函数
trap 'shutdown' SIGTERM SIGINT

# 3. 更新 Unturned 游戏本体
echo ">>> (1/4) Checking for Unturned game updates..."
/data/steamcmd/steamcmd.sh \
    +force_install_dir /data/unturned \
    +login anonymous \
    +app_update 1110390 validate \
    +quit
echo ">>> Unturned game files are up-to-date."

# 4. 启动 cron 定时任务服务
echo ">>> (2/4) Starting cron daemon in the background..."
cron

# 5. 在 tmux 中启动 Unturned 服务器
echo ">>> (3/4) Starting Unturned server inside a tmux session..."
mkdir -p /data/unturned/Servers/MyServer
cd /data/unturned

# 启动服务器。我们在 myServer.sh 命令结束后，追加了一个 'tmux wait-for' 命令。
# 这意味着：当 Unturned 进程（由 myServer.sh 包装）正常退出后，
# tmux 会立刻通过 TMUX_WAIT_CHANNEL 频道发出一个“我完工了”的信号。
tmux new-session -d -s "$TMUX_SESSION" \
  "./myServer.sh; tmux wait-for -S '$TMUX_WAIT_CHANNEL'"

# 6. 等待服务器进程结束
echo ">>> (4/4) Server is running. Script is now monitoring the server process."
echo ">>> To see server logs, run: docker logs -f unturned-server"
echo ">>> To send manual commands, run: docker exec unturned-server tmux send-keys -t $TMUX_SESSION \"your_command\" C-m"

# 这是新的主进程和等待逻辑：
# 脚本的主进程现在就是等待我们定义的那个“完工”信号。
# `& wait $!` 的组合确保了即使 `tmux wait-for` 在后台运行，trap 依然能捕获到信号，从而允许我们手动触发关服。
# 这个命令会一直阻塞在这里，直到它收到了来自 tmux 内部发出的信号，或者被 trap 中断。
(tmux wait-for "$TMUX_WAIT_CHANNEL") & wait $!

echo ">>> 'wait-for' signal received. Unturned process has terminated correctly or shutdown was triggered."
echo ">>> Container is now shutting down cleanly."

